// Package service
// @Author: zhangdi
// @File: ClipboardListen
// @Version: 1.0.0
// @Date: 2023/5/19 18:02
package service

import (
	"ideatools/application/db/dbdto"
	"ideatools/application/db/dbservice"
	"ideatools/application/pkgs/clips"
	"strings"
	"time"
)

type ClipListenService struct {
	ListenTime  int                         //定时监听周期，单位毫秒
	LastText    string                      //上一个文本
	CurrText    string                      //当前文本
	isListening bool                        //是否正在监听
	dbService   *dbservice.ClipboardService //数据库对象
}

// StartClipListenService 监听剪切板服务 listenTime为毫秒
func StartClipListenService(listenTime int) *ClipListenService {
	dbServ := dbservice.NewClipboardService()
	s := &ClipListenService{
		ListenTime:  listenTime,
		isListening: true,
		dbService:   dbServ,
	}

	//获取上一次
	lasts := s.dbService.GetLastClipText(1)
	if len(lasts) > 0 {
		s.LastText = lasts[0]
	}
	//检查是超出条数，超出则删除
	s.dbService.CheckMaxSave()

	go s.listenClipboardChange()
	return s
}

// ListenClipboardChange 监听剪贴板，并在剪贴板内容发生变化时执行指定动作
func (s *ClipListenService) listenClipboardChange() {
	for {
		//停止监听
		if !s.isListening {
			break
		}

		// 获取当前剪贴板内容
		clipboardText, err := clips.GetLeastText()
		clipboardText = strings.TrimSpace(clipboardText)
		if err != nil {
			//mylog.Error(err.Error())
			continue
		}

		// 如果剪贴板内容有更新，则执行回调函数f
		if clipboardText != s.LastText && clipboardText != "" {

			s.dbService.CreateClipboard(&dbdto.ClipboardAdd{
				Content: clipboardText,
			})

			s.CurrText = clipboardText
			s.LastText = s.CurrText
			//执行自定义逻辑

			//println("Clipboard content updated:", clipboardText)
			//ctx := global.GetCtx()
			//if ctx != nil {
			//	runtime.EventsEmit(ctx, "event1", clipboardText)
			//}

		}

		// 睡眠指定时间后进行下一次监视
		time.Sleep(time.Millisecond * time.Duration(s.ListenTime))
	}
}

func (s *ClipListenService) StopListenClipboard() {
	s.isListening = false
}

//func (s *ClipListenService) GetListText(num int) []string {
//	s.dbService.GetListClipboard()
//	return s.ListText
//}
